﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Web;
using System.Web.Services;

using BMG.DAL;

namespace BMG.BLL.Classes
{
    /// <summary>
    /// Application BMG
    /// Création le 31/03/2011
    /// 
    /// Classe business de gestion des données de type CATEGORIE
    /// 
    /// Modifications:
    /// -20/04: QUH Modification de GetHistorique ln 80 pour correspondre à data_provider.GetCategorieHistorique
    /// </summary>
    public static class CATEGORIE_MANAGER
    {
        #region METHODS

        #region Get

        /// <summary>
        /// Méthode de récupération de la liste des catégories
        /// </summary>
        /// <param name="aDescriptionNom">Nom ou description de la catégorie</param>
        /// <param name="aID_PARENT">Identifiant du parent de la catégorie</param>
        /// <returns>Datatable</returns>
        [WebMethod(Description = "Récupère la liste des catégories")] 
        public static DataTable GetList(String aDescriptionNom, int? aID_PARENT)
        {
            try
            {
                return Data_Provider.GetCategorieList(aDescriptionNom, aID_PARENT);

            }
            catch (Exception ex)
            {
                //TODO-BEN Gestion des exceptions
                throw ex;
            }
        }
        
        /// <summary>
        /// Méthode de récupération de la liste de toute les catégories
        /// </summary>
        /// <param name="aWithNoChoice">Avec ou sans le choix "null"</param>
        /// <returns>Datatable</returns>
        [WebMethod(Description = "Récupère la liste de toutes les catégories")] 
        public static DataTable GetList(bool aWithNoChoice)
        {
            try
            {
                DataTable Retour = Data_Provider.GetCategorieList(null, null);

                if (aWithNoChoice)
                {
                    DataRow ChoixNull = Retour.NewRow();
                    //TODO-BEN ici qd la structure de la datable sera connue ajouter un tiret au nom et -1 à l'ID
                    ChoixNull["id_cat"] = -1;
                    ChoixNull["intitule_cat"] = "--";
                    ChoixNull["description_cat"] = "Toutes les catégories";
                    ChoixNull["pid_cat"] = 0;
                    Retour.Rows.InsertAt(ChoixNull, 0);
                }

                return Retour;
            }
            catch (Exception)
            {
                //TODO-BEN Gestion des exceptions
                throw;
            }
        }

        /// <summary>
        /// Méthode de récupération de l'historique des catégories selon une date
        /// </summary>
        /// <param param name="aDateFrom">Date inférieure de la tranche de temps concernée</param>
        /// <param name="aDateTo">Date supérieure de la tranche de temps concernée</param>
        /// <returns>DataTable</returns>
        public static DataTable GetHistorique(int? aID_CATEGORIE, DateTime aDateFrom, DateTime aDateTo)
        {
            try
            {
                //TODO-BEN Transformer les date en string et les passer a la DAL quand Quentin aurait changé la signature de la méthode
                return Data_Provider.GetCategorieHistorique(aID_CATEGORIE, aDateFrom, aDateTo);
            }
            catch (Exception)
            {
                //TODO-BEN Gestion des exceptions
                return null;
            }
        }

        /// <summary>
        /// Méthode de récupération des données d'une catégorie particulière
        /// </summary>
        /// <param name="aID_CATEGORIE">Identifiant de la catégorie dont on veut récuper les données</param>
        /// <returns>DataRow</returns>
        [WebMethod(Description = "Récupère les détails d'une catégorie")] 
        public static DataRow Get(int aID_CATEGORIE)
        {
            try
            {
                return Data_Provider.GetCategorie(aID_CATEGORIE);
            }
            catch (Exception ex)
            {
                //TODO gestion des exceptions
                throw ex;
            }
        }

        #endregion

        #region Update
        /// <summary>
        /// Méthode de mise à jour de la catégorie
        /// </summary>
        /// <param name="aCategorie">Catégorie à mettre à jour</param>
        /// <returns>1 si ok,-1 si problème</returns>
        public static int Update(int aID_CAT, string aINTITULE_CAT, string aDESCRIPTION_CAT, int? aPID_CAT)
        {
            try
            {                
                if (!CheckForUpdate(aID_CAT, aINTITULE_CAT, aDESCRIPTION_CAT, aPID_CAT))
                {
                    return -1;
                }
                return Data_Provider.UpdateCategorie(aID_CAT, aINTITULE_CAT, aDESCRIPTION_CAT, aPID_CAT); 
            }
            catch (Exception e)
            {
                //TODO-BEN Gestion des exceptions
                
                return -1;
            }
        }

        #endregion

        #region Insert
        /// <summary>
        /// Méthode d'insertion d'une catégorie
        /// </summary>
        /// <param name="aIntitule">Intitulé de la catégorie</param>
        /// <param name="aDescription">Description de la catégorie</param>
        /// <param name="aPID">Identifiant de la catégorie parente</param>
        /// <returns>- si ok,-1 si problèmeme</returns>
        public static int Insert(string aIntitule, string aDescription, int? aPID)
        {
            try
            {
                return Data_Provider.InsertCategorie(aIntitule, aDescription, aPID);
            }
            catch (Exception)
            {
                //TODO-BEN Gestion des Exceptions
                return -1;                
            }
        }
        #endregion

        #region Delete
        /// <summary>
        /// Méthode de suppression d'une catégorie
        /// </summary>
        /// <param name="aID_CATEGORIE">Identifiant de la catégorie a supprimer</param>
        /// <returns>1 si probleme, -1 si ok</returns>
        public static int Delete(int aID_CATEGORIE)
        {
            try
            {
                return Data_Provider.DeleteCategorie(aID_CATEGORIE);
            }
            catch (Exception)
            {
                //TODO-BEN gestion des exceptions
                return -1;                
            }
        }

        /// <summary>
        /// Méthode de suppression des produits d'une catégorie
        /// </summary>
        /// <param name="aID_CATEGORIE">Identifiant de la catégorie pour laquelle on veut supprimer les produits</param>
        /// <returns>1 si ok, -1 si problème</returns>
        public static int DeleteProducts(int aID_CATEGORIE)
        {
            try
            {
                return Data_Provider.DeleteProduitsFromCategorie(aID_CATEGORIE);
            }
            catch (Exception)
            {
                //TODO-BEN Gestion des exceptions                
                return -1;
            }
        }
        #endregion

        #region Misc
        /// <summary>
        /// Méthode de déplacement des produits d'une catégorie vers une autre
        /// </summary>
        /// <param name="aID_CATEGORIE_FROM">Identifiant de la catégorie source</param>
        /// <param name="aID_CATEGORIE_TO">Identifiant de la catégorie de destination</param>
        /// <returns>1 si ok, -1 si probleme</returns>
        public static int MoveProduits(int aID_CATEGORIE_FROM, int aID_CATEGORIE_TO)
        {
            try
            {
                return Data_Provider.MoveProduitsToCategorie(aID_CATEGORIE_FROM, aID_CATEGORIE_TO);
            }
            catch (Exception)
            {
                //TODO-BEN Gestion des exceptions
                return -1;
            }
        }

        /// <summary>
        /// Méthode de vérification des données pour l'update d'une catégorie
        /// </summary>
        /// <param name="aID_CAT">Identifiant de la catégorie</param>
        /// <param name="aINTITULE_CAT">Intitulé de la catégorie</param>
        /// <param name="aDESCRIPTION_CAT">Description de la catégorie</param>
        /// <param name="aPID_CAT">Identifiant de la catégorie parent</param>
        /// <returns>Booléen</returns>
        static private bool CheckForUpdate(int aID_CAT, string aINTITULE_CAT, string aDESCRIPTION_CAT, int? aPID_CAT)
        {
            bool result = true;
            if (aID_CAT < 1)
            {
                result = false;
            }
            if (aINTITULE_CAT == "" || aINTITULE_CAT == null)
            {
                result = false;
            }
            if (aDESCRIPTION_CAT == "" || aDESCRIPTION_CAT == null)
            {
                result = false;
            }
            if (aPID_CAT < -1)
            {
                result = false;
            }

            return result;
        }
        #endregion

        #endregion
    }
}
